/*Question1*/
:-lib(ic).

/*Valeurs possibles pour la couleur du bateau*/

couleurB(vert(X)):- teinte(X).
couleurB(noir(X)):- teinte(X).
couleurB(blanc(X)):- teinte(X).

/*Valeurs possibles pour la couleur de la voiture*/
couleurV(rouge).
couleurV(vert(clair)).
couleurV(gris).
couleurV(blanc).

/*Valeurs possibles pour les teintes*/
teinte(clair).
teinte(fonce).
teinte(kaki).

/*Prédicat choixCouleur(?CouleurBateau,?CouleurVoiture)*/
choixCouleur(CouleurBateau,CouleurVoiture):- 
	couleurB(CouleurBateau),
	couleurV(CouleurVoiture),
	CouleurBateau = CouleurVoiture.

/*Résultat :
[eclipse 33]: choixCouleur(vert(clair),vert(clair)).

Yes
*/


/*Question2*/

/*Predicat isBetween(?Var,+Min,+Max)*/
isBetween(Var,Min,Max):-
	Min=<Max,
	(Var = Min; 
	Z is Min+1,
	isBetween(Var,Z,Max)).

/*Résultat :
[eclipse 30]: 19.
isBetween(X, 10, 20).

X = 10
Yes (0.00s cpu, solution 1, maybe more) ? ;

X = 11
Yes (0.00s cpu, solution 2, maybe more) ? ;

X = 12
Yes (0.00s cpu, solution 3, maybe more) ? ;

X = 13
Yes (0.00s cpu, solution 4, maybe more) ? ;

X = 14
Yes (0.00s cpu, solution 5, maybe more) ? ;

X = 15
Yes (0.00s cpu, solution 6, maybe more) ? ;

X = 16
Yes (0.00s cpu, solution 7, maybe more) ? ;

X = 17
Yes (0.00s cpu, solution 8, maybe more) ? ;

X = 18
Yes (0.00s cpu, solution 9, maybe more) ? ;

X = 19
Yes (0.00s cpu, solution 10, maybe more) ? ;

X = 20
Yes (0.00s cpu, solution 11, maybe more) ? ;

No (0.00s cpu)

*/


/*commande(-NbResistance, -NbCondensateur)*/
commande(NbResistance,NbCondensateur):-
	isBetween(NbResistance,5000,10000),
	isBetween(NbCondensateur,9000,20000),
	NbResistance>=NbCondensateur.
/*Résultat :
[eclipse 33]: commande(X,Y).

X = 9000
Y = 9000

*/


/*Résultat de trace :
  (1) 1 CALL  commande(X, Y)   %> creep
  (2) 2 CALL  isBetween(X, 5000, 10000)   %> creep
  (3) 3 CALL  5000 =< 10000   %> creep
  (3) 3 EXIT  5000 =< 10000   %> creep
  (4) 3 CALL  ... = ...   %> creep
  (4) 3 EXIT  ... = ...   %> creep
  (2) 2 *EXIT  isBetween(5000, 5000, 10000)   %> creep
  (5) 2 CALL  isBetween(Y, 9000, 20000)   %> creep
  (6) 3 CALL  9000 =< 20000   %> creep
  (6) 3 EXIT  9000 =< 20000   %> creep
  (7) 3 CALL  ... = ...   %> creep
  (7) 3 EXIT  ... = ...   %> creep
  (5) 2 *EXIT  isBetween(9000, 9000, 20000)   %> creep
  (8) 2 CALL  5000 >= 9000   %> creep
  (8) 2 FAIL  ... >= ...   %> creep
  (5) 2 REDO  isBetween(Y, 9000, 20000)   %> creep
  (9) 3 CALL  +(9000, 1, ...)   %> creep
  (9) 3 EXIT  +(9000, 1, 9001)   %> creep
  (10) 3 CALL  isBetween(Y, 9001, 20000)   %> creep
  (11) 4 CALL  9001 =< 20000   %> creep
  (11) 4 EXIT  9001 =< 20000   %> creep
  (12) 4 CALL  ... = ...   %> creep
  (12) 4 EXIT  ... = ...   %> creep
  (10) 3 *EXIT  isBetween(9001, 9001, 20000)   %> creep
  (5) 2 *EXIT  isBetween(9001, 9000, 20000)   %> creep
  (13) 2 CALL  5000 >= 9001   %> creep
  (13) 2 FAIL  ... >= ...   %> creep
*/

/*Question 7*/

commande2(NbResistance,NbCondensateur):-
	NbCondensateur #:: 9000..20000,	
	NbResistance #:: 5000..10000,
	NbResistance #>= NbCondensateur.

/*Résultat :

        commande2(X,Y).

X = X{9000 .. 10000}
Y = Y{9000 .. 10000}


Delayed goals:
        Y{9000 .. 10000} - X{9000 .. 10000} #=< 0

*/

/*Question 8*/
commande3(NbResistance,NbCondensateur):-
	NbCondensateur #:: 9000..20000,	
	NbResistance #:: 5000..10000,
	NbResistance #>= NbCondensateur,
	labeling([NbCondensateur,NbResistance]).
/*Résultat :

[eclipse 8]: commande3(X,Y).

X = 9000
Y = 9000


*/


/*Question 9*/
/*chapie(-Chats,-Pies,-Pattes,-Tetes)*/
chapie(Chats,Pies,Pattes,Tetes):-
	Chats #:: 0..20,
	Pies #:: 0..20,
	Tetes #= Chats + Pies,
	Pattes #= 4*Chats + 2*Pies,
	Pattes #= 3*Tetes,
	labeling([Tetes]).

/*Combien de pies et de pattes faut-il pour totaliser 5 têtes et 2 chats
[eclipse 10]: chapie(2,X,Y,5).

X = 3
Y = 14

*/

/*Combien faut-il de chats et de pies pour avoir 3 fois plus de pattes que de tetes

chapie(X, Y, Z, W).
lists.eco  loaded in 0.01 seconds

X = 0
Y = 0
Z = 0
W = 0
Yes (0.01s cpu, solution 1, maybe more) ? ;

X = 1
Y = 1
Z = 6
W = 2
Yes (0.01s cpu, solution 2, maybe more) ? ;

X = 2
Y = 2
Z = 12
W = 4
Yes (0.01s cpu, solution 3, maybe more) ? ;

*/

/*Question 11*/
/*vabs(?Val,?AbsVal)*/
/*1ère méthode : avec le point de choix Prolog*/
vabs(Val,AbsVal):-
	Val #< 0, !, AbsVal #= -Val.
vabs(Val,Val).

/*
Résultats:
[eclipse 14]: vabs(3,X).

X = 3
Yes (0.00s cpu)
[eclipse 15]: vabs(-3,X).

X = 3
*/

/*2ème méthode : avec l'opérateur de disjonction "or"*/

vabs2(Val,AbsVal):-
	AbsVal #= -Val, 0 or Val #< 0.
vabs2(Val,Val):-
	Val #>= 0.

/*
Résultats:
vabs2(-3, X).

X = 3
*/

/*Question 12*/
/*Execution de X #:: -10..10, vabs(X,Y)

1ère méthode:

	[eclipse 38]: X #:: -10..10 , vabs(X,Y).

	X = X{-10 .. -1}
	Y = Y{1 .. 10}


	Delayed goals:
		Y{1 .. 10} + X{-10 .. -1} #= 0
	Yes (0.00s cpu)

2ème méthode : 

[eclipse 46]: X #:: -10..10 , vabs2(X,Y).

X = X{-10 .. -1}
Y = Y{1 .. 10}


Delayed goals:
        Y{1 .. 10} + X{-10 .. -1} #= 0
Yes (0.00s cpu, solution 1, maybe more) ? ;

X = Y{0 .. 10}
Y = Y{0 .. 10}
Yes (0.00s cpu, solution 2)

-->La seconde méthode permet de couvrir l'ensemble du domaine de X alors que la première s'arrêtait à la fin des cas négatifs.

*/

/*Question 13*/
/*faitListe(?ListVar, ?Taille, +Min, +Max)*/

faitListe([],0,Min,Max):-
	Min #=< Max.
faitListe([A|R],N,Min,Max):-
	Min #=< Max,
	A #:: Min..Max,
	M is N-1,
	faitListe(R,M,Min,Max),
	labeling([A]).

/*
Résultats :

[eclipse 51]: faitListe(L,5,0,10).

L = [_317{0 .. 10}, _407{0 .. 10}, _497{0 .. 10}, _587{0 .. 10}, _677{0 .. 10}]

*/

/*Question 14*/

/*suite(?ListVar)*/
suite([]).
suite([A]).
suite([A,B]).
suite([A,B,C|R]):-
	vabs2(B,VB),
	A #= VB-C,
	suite([B,C|R]).
